package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IInstitutionTypeDAO;
import org.jsola.hr.dto.InstitutionTypeAddDTO;
import org.jsola.hr.dto.InstitutionTypeUpdateDTO;
import org.jsola.hr.entity.InstitutionTypeDO;
import org.jsola.hr.query.InstitutionTypeQuery;
import org.jsola.hr.vo.InstitutionStatisticalVO;
import org.jsola.hr.vo.InstitutionTypeListVO;
import org.jsola.hr.vo.InstitutionTypeVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 制度分类
 *
 * @author zhr
 */
public interface IInstitutionTypeService extends IService<IInstitutionTypeDAO, InstitutionTypeDO> {

    /**
     * 新增制度分类
     *
     * @param institutionTypeAddDTO 新增制度分类DTO
     * @param tokenUser             当前用户
     * @return 制度分类详情信息
     */
    InstitutionTypeVO save(InstitutionTypeAddDTO institutionTypeAddDTO, TokenUser tokenUser);

    /**
     * 修改制度分类
     *
     * @param institutionTypeUpdateDTO 修改制度分类DTO
     * @param tokenUser                当前用户
     * @return 更新数量
     */
    int update(InstitutionTypeUpdateDTO institutionTypeUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除制度分类，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser          当前用户
     * @param institutionTypeIds 制度分类id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... institutionTypeIds);

    /**
     * 根据制度分类id查找
     *
     * @param institutionTypeId 制度分类id
     * @param siteId            所属站点id
     * @return 制度分类详情信息
     */
    InstitutionTypeVO selectById(String institutionTypeId, String siteId);

    /**
     * 查询制度分类
     *
     * @param institutionTypeQuery 查询条件
     * @param siteId               所属站点id
     * @return 制度分类列表信息
     */
    List<InstitutionTypeListVO> select(InstitutionTypeQuery institutionTypeQuery, String siteId);

    /**
     * 查询制度分类记录数
     *
     * @param institutionTypeQuery 查询条件
     * @param siteId               所属站点id
     * @return 制度分类记录数
     */
    int selectCount(InstitutionTypeQuery institutionTypeQuery, String siteId);

    /**
     * 分页查询制度分类
     *
     * @param institutionTypeQuery 查询条件
     * @param siteId               所属站点id
     * @return 制度分类列表信息
     */
    Page<InstitutionTypeListVO> selectPage(InstitutionTypeQuery institutionTypeQuery, String siteId);


    /**
     * 根据制度分类id查找
     *
     * @param institutionTypeId 制度分类id
     * @param siteId            所属站点id
     * @return 制度分类
     */
    InstitutionTypeDO selectDOById(String institutionTypeId, String siteId);

    /**
     * 根据制度分类id查找
     *
     * @param institutionTypeIds 制度分类id
     * @param siteId             所属站点id
     * @return 制度分类
     */
    List<InstitutionTypeDO> selectDOByIds(List<String> institutionTypeIds, String siteId);


    /**
     * 根据制度分类父id查找
     *
     * @param parentIds 制度分类id
     * @param siteId    所属站点id
     * @return 制度分类
     */
    List<InstitutionTypeDO> selectDOByParentIds(List<String> parentIds, String siteId);

    /**
     * 查询制度分类
     *
     * @param institutionTypeQuery 查询条件
     * @param siteId               所属站点id
     * @return 制度分类列表
     */
    List<InstitutionTypeDO> selectDO(InstitutionTypeQuery institutionTypeQuery, String siteId);

    /**
     * 查询用工单位下制度分类及制度(树形结构)
     *
     * @param companyId 用工单位Id
     * @param siteId    所属站点id
     * @return 制度分类列表
     */
    List<InstitutionTypeListVO> selectTreeByCompany(String companyId, String siteId);

    /**
     * 查询站点下一级分类
     *
     * @param siteId    所属站点id
     * @return 制度分类列表
     */
    List<InstitutionTypeListVO> selectFirstBySite(String siteId);

    /**
     * 查询站点下制度分类
     *
     * @param name   分类名称
     * @param siteId 所属站点id
     * @return 制度分类列表
     */
    List<InstitutionTypeDO> selectByName(String name, String siteId);

    /**
     * 查询站点下制度分类及制度
     *
     * @param companyId 用工单位Id
     * @param siteId    所属站点id
     * @return 制度分类列表
     */
    InstitutionStatisticalVO selectInstitutionByCompanyId(String companyId, String siteId);

}


